package com.fenqing.leetcode.code.t0_200.t0_100;

import com.fenqing.annotations.Execute;
import com.fenqing.core.Topic;

/**
 * @author fenqing
 */
public class Topic050 extends Topic {
    /**
     * 构造器
     *
     * @param input1 输入1
     * @param input2 输入2
     */
    public Topic050(String input1, String input2) {
        super(input1, input2);
    }

    @Execute
    public double myPow(double x, int n) {
        //如果是0 返回1
        if (n == 0) {
            return 1;
        }
        //或者 1直接返回本身无需计算
        if (n == 1) {
            return x;
        }
        if (n < 0) {
            //如果幂小于0，则等于值的倒数
            return 1 / myPow2(x, -(long) n);
        } else {
            return myPow2(x, n);
        }
    }

    public double myPow2(double x, long n) {
        // 因为int -2147483648 取绝对值会溢出，等于 -2147483648，所以使用long
        // 如果幂为1，则直接返回x
        if (n == 1) {
            return x;
        }
        double num = myPow2(x, n / 2);
        if (n % 2 == 0) {
            // 如果幂为偶数，则为幂的一半乘以一半 例如： 2^8 == 2^4 * 2^4
            return num * num;
        } else {
            // 如果幂为奇数，则为幂的一半乘以一半乘以x 例如： 2^9 == 2^4 * 2^4 * 2^1
            return num * num * x;
        }
    }


    public static void main(String[] args) {
        Topic050 topic050 = new Topic050("0.44528", "0");
        double run = topic050.run();
        System.out.println(run);
    }
}
